home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src890906.arc / IPDUMP.C < prev    next >
C/C++ Source or Header  |  1989-08-19  |  2KB  |  80 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "internet.h"
  5. #include "timer.h"
  6. #include "iface.h"
  7. #include "ip.h"
  8. #include "trace.h"
  9. #include "netuser.h"
  10.  
  11. void
  12. ip_dump(bpp,check)
  13. struct mbuf **bpp;
  14. int check;
  15. {
  16.     struct ip ip;
  17.     int16 ip_len;
  18.     int16 length;
  19.     int16 csum;
  20.  
  21.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  22.         return;    
  23.  
  24.     printf("IP:");
  25.     /* Sneak peek at IP header and find length */
  26.     ip_len = ((*bpp)->data[0] & 0xf) << 2;
  27.     if(ip_len < IPLEN){
  28.         printf(" bad header\n");
  29.         return;
  30.     }
  31.     if(check)
  32.         csum = cksum(NULLHEADER,*bpp,ip_len);
  33.     else
  34.         csum = 0;
  35.  
  36.     ntohip(&ip,bpp);    /* Can't fail, we've already checked ihl */
  37.  
  38.     /* Trim data segment if necessary. */
  39.     length = ip.length - ip_len;    /* Length of data portion */
  40.     trim_mbuf(bpp,length);    
  41.     printf(" len %u",ip.length);
  42.     printf(" %s",inet_ntoa(ip.source));
  43.     printf("->%s ihl %u ttl %u",
  44.         inet_ntoa(ip.dest),ip_len,uchar(ip.ttl));
  45.     if(ip.tos != 0)
  46.         printf(" tos %u",uchar(ip.tos));
  47.     if(ip.offset != 0 || ip.flags.mf)
  48.         printf(" id %u offs %u",ip.id,ip.offset);
  49.     if(ip.flags.df)
  50.         printf(" DF");
  51.     if(ip.flags.mf){
  52.         printf(" MF");
  53.         check = 0;    /* Bypass host-level checksum verify */
  54.     }
  55.     if(csum != 0)
  56.         printf(" CHECKSUM ERROR (%u)",csum);
  57.  
  58.     if(ip.offset != 0){
  59.         printf("\n");
  60.         return;
  61.     }
  62.     switch(uchar(ip.protocol)){
  63.     case TCP_PTCL:
  64.         printf(" prot TCP\n");
  65.         tcp_dump(bpp,ip.source,ip.dest,check);
  66.         break;
  67.     case UDP_PTCL:
  68.         printf(" prot UDP\n");
  69.         udp_dump(bpp,ip.source,ip.dest,check);
  70.         break;
  71.     case ICMP_PTCL:
  72.         printf(" prot ICMP\n");
  73.         icmp_dump(bpp,ip.source,ip.dest,check);
  74.         break;
  75.     default:
  76.         printf(" prot %u\n",uchar(ip.protocol));
  77.         break;
  78.     }
  79. }
  80.